package com.itheima.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.common.R;
import com.itheima.common.ReggieConstants;
import com.itheima.dto.UserLoginDto;
import com.itheima.pojo.User;
import com.itheima.service.UserService;
import com.itheima.utils.SMSUtils;
import com.itheima.utils.ValidateCodeUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @Autowired
    private UserService userService;

    // 有泛型 默认objkt
    @Autowired
    private RedisTemplate redisTemplate;

    // 移动端验证码
    @PostMapping("/sendMsg")
    public R<String> sendMsg(@RequestBody User user , HttpServletRequest request){
        // 判断下你的手机号
        if (StringUtils.isNotBlank(user.getPhone())){
            // 生成验证码
            String code = ValidateCodeUtils.generateValidateCode(4).toString();
            // 模拟发送短信
            // SMSUtils.sendMessage();
            // 打印验证码
            log.info("验证码:{}",code);
            // 存储code , 方便一会登录的时候校验
           // request.getSession().setAttribute(user.getPhone(),code);
            //改造成将验证码放到redis里
            redisTemplate.opsForValue().set(ReggieConstants.USER_CODE_REDIS_FREFIX+user.getPhone(),code,5, TimeUnit.MINUTES);
        }
        return  R.success("发送成功");
    }

    // 移动端用户登录
    @PostMapping("/login")
    public R<User> userLogin(@RequestBody  UserLoginDto userLoginDto , HttpServletRequest request){

        // 验证手机号-验证码的正确性
        if (StringUtils.isNotBlank(userLoginDto.getPhone()) || StringUtils.isBlank(userLoginDto.getCode())){
            R.error("手机号或验证码为空无法登录");
        }
        // 取之前存好的code
        // String codeInSession = (String) request.getSession().getAttribute(userLoginDto.getPhone());
        // 从Redis取
        String codeInRedis = (String) redisTemplate.opsForValue().get(ReggieConstants.USER_CODE_REDIS_FREFIX+userLoginDto.getPhone());
        if (codeInRedis != null && codeInRedis.equals(userLoginDto.getCode())){
         // 匹配上了
            // 还要检查一下有没有注册过
          User user =  userService.getOne(new LambdaQueryWrapper<User>().eq(User::getPhone,userLoginDto.getPhone()));
          if (user == null) {
              // ==null 证明没注册
              user = new User();
              user.setPhone(userLoginDto.getPhone());
              user.setStatus(1);
              userService.save(user);
          }
          // 检查禁用状态
          if (user.getStatus()==0){
              return  R.error("用户已被禁用");
          }
          // 把id放的到session
          request.getSession().setAttribute(ReggieConstants.USER_SESSION_KEY,user.getId());
          // 登陆成功后 删除对应的code
            redisTemplate.delete(ReggieConstants.USER_CODE_REDIS_FREFIX+userLoginDto.getPhone());
          return R.success(user);
        }
        // 到这里 肯定是报错 说明code没匹配上
        return  R.error("验证码失效或错误");
    }

    @PostMapping("/loginout")
    public R<String> userLoginout(HttpServletRequest request){
        request.getSession().removeAttribute(ReggieConstants.USER_SESSION_KEY);
        return R.success("退出成功");
    }

}
